from django.contrib.auth.models import User
from django.db import models

# Create your models here.
# 继承models.Model成为模型类
# 创建完模型类之后都需要迁移映射
"""
int -- IntegerField 整型
varchar --CharField 字符类型
longtext--TextField 文本类型
date--DateField 日期类型
BooleanField 布尔类型
DateTime 日期时间类型
ImageField 图片文件类型
FileField 文件类型
AutoField 自增长类型

字段的常用的属性 表约束
unique：唯一约束
null：默认就是非空 指定为True
primary_key：主键
default：设置默认值
blank：表单提交的值可以为空 
datefield.autonow:每次修改都会将当前的时间更新进去
datefield.autonow_add:第一次会添加，会将当前时间设置进去，以后不会修改这个值
"""


# 继承模型类才能让自定义类成为模型类
# 模型就是一个数据表
# 类字段就是表字段
# 实例化对象是表数据
# class定义类 关键字
# classes分类 类名
class Classes(models.Model):
    # 设置自增长约束 主键约束
    # id = models.AutoField(primary_key=True)
    # 限制最长字段值为30 默认都有非空约束 设置可以为空null=True
    name = models.CharField(max_length=30, unique=True)

    # slogan=models.CharField(max_length=50)

    # 重写 输出魔法方法
    def __str__(self):
        return self.name


# 创建标签模型
class Label(models.Model):
    name = models.CharField(max_length=30, unique=True)

    # 重写输出魔法方法
    def __str__(self):
        return self.name


# 创建用户详情表
class UserDetail(models.Model):
    # blank=True 前端的传值可以为空 null=True 数据表里面的值可以为空
    age = models.IntegerField(null=True, blank=True)
    sex = models.BooleanField(null=True, blank=True)
    # 关联用户表 指定user表的数据被删除时，用户详情表的数据一起被删除
    user = models.OneToOneField(User, on_delete=models.CASCADE)


# 创建文章表
class Article(models.Model):
    # 文章标题
    title = models.CharField(max_length=30)
    # 文章简介
    desc = models.CharField(max_length=100)
    # 文章内容
    content = models.TextField()
    # 封面图 实际上保存的图片的地址 路由 图片保存在服务器当中
    cover = models.TextField()
    # 创建时间 日期时间类型
    create_time = models.DateTimeField(auto_now_add=True)
    # 更新时间
    update_time = models.DateTimeField(auto_now=True)

    # 建立表关系 约束
    # 跟文章分类表的表约束 NOT_PROVIDED当分类表删除时，还有文章 限制分类不能被删除
    # 第一个参数是你要关联的表 第二个参数是删除行为
    # related_name='a' 自定义管理器名字
    classes = models.ForeignKey(Classes, on_delete=models.NOT_PROVIDED, )

    # 跟用户表的表约束
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    # 多对多表关系建立 建立删除行为 因为多对多会产生关系表
    # 关系表会自动创建
    label = models.ManyToManyField(Label)

    def __str__(self):
        return 'Article<title:%s>' % self.title
